<?php
/**
 * @copyright Copyright (c) 2021 勾股工作室
 * @license https://opensource.org/licenses/GPL-3.0
 * @link https://www.gougucms.com
 */

declare (strict_types=1);

namespace app\base;

use systematic\Systematic;
use think\App;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use think\facade\Cache;
use think\facade\Db;
use think\facade\Session;
use think\facade\View;

/**
 * 控制器基础类
 */
abstract class BaseController
{
    /**
     * Request实例
     * @var \think\Request
     */
    protected $request;

    /**
     * 应用实例
     * @var \think\App
     */
    protected $app;

    /**
     * 是否批量验证
     * @var bool
     */
    protected $batchValidate = false;

    /**
     * 控制器中间件
     * @var array
     */
    protected $middleware = [];

    /**
     * 构造方法
     * @access public
     * @param App $app 应用对象
     */
    public function __construct(App $app)
    {
        $this->app = $app;
        $this->request = $this->app->request;
        $this->module = strtolower(app('http')->getName());
        $this->controller = strtolower($this->request->controller());
        $this->action = strtolower($this->request->action());
        $this->uid = 0;
        $this->did = 0;
        $this->pid = 0;
        // 控制器初始化
        $this->initialize();
    }

    /**
     * 初始化
     * @throws ModelNotFoundException
     * @throws DbException
     * @throws DataNotFoundException
     */
    protected function initialize()
    {
        // 检测权限
        $this->checkLogin();
    }

    /**
     * 验证用户登录
     * @throws DataNotFoundException
     * @throws DbException
     * @throws ModelNotFoundException
     */
    protected function checkLogin()
    {
        $session_admin = get_config('app.session_admin');

        if (!Session::has($session_admin)) {
            if ($this->request->isAjax()) {
                return to_assign(404, '请先登录');
            } else {
                redirect('/home/login/index.html')->send();
                exit;
            }
        }

        $this->uid = Session::get($session_admin);
        $login_admin = Db::name('Admin')->where(['id' => $this->uid])->find();

        $this->did = $login_admin['did'];
        $this->pid = $login_admin['position_id'];
        View::assign('login_admin', $login_admin);

        //免验证权限方法
        $auth_data = cache('auth_data'); // 从缓存中获取 $auth_data 数组
//        $auth_data = null; // 从缓存中获取 $auth_data 数组
        if (!$auth_data) {
            $auth_data = config('auth');
            cache('auth_data', $auth_data, 3600); // 将 $auth_data 数组缓存起来，有效期为 1 小时
        }
        $pathUrl = $this->module . '/' . $this->controller . '/' . $this->action;
        $pathUrlController = $this->module . '/' . $this->controller;
        if (in_array($pathUrl , $auth_data['auth_admin']) or in_array($pathUrlController,$auth_data['auth_controller'])) {
            return true;
        }

        $is_lock = $login_admin['is_lock'];
        if ($is_lock == 1) {
            redirect('/home/login/lock.html')->send();
            exit;
        }

        if (($this->module == 'api') || ($this->module == 'message') || ($this->module == 'home' && $this->controller == 'index')) {
            return true;
        }

        $reg_pwd = $login_admin['reg_pwd'];
        if ($reg_pwd !== '') {
            redirect('/home/index/edit_password.html')->send();
            exit;
        }

        if (!$this->checkAuth()) {

            if ($this->request->isAjax()) {
                return to_assign(405, '你没有权限,请联系管理员或者HR');
            } else {
                echo '<div style="text-align:center;color:red;margin-top:20%;">你没有权限访问，请联系管理员或者人事部</div>';
                exit;
            }
        }
    }

    /**
     * 验证用户访问权限
     * @return bool [type]
     */
    protected function checkAuth(): bool
    {
        //Cache::delete('RulesSrc' . $uid);
        //$auth_list_all = Cache::get('RulesSrc0');
        $uid = $this->uid;
        $GOUGU = new Systematic();
        $GOUGU->auth($uid);
        $auth_list = Cache::get('RulesSrc' . $uid);
        $pathUrl = $this->module . '/' . $this->controller . '/' . $this->action;
        return in_array($pathUrl, $auth_list);
    }
}
